package edu.server.dominio;

import java.util.List;

import org.hibernate.Hibernate;
import org.hibernate.Query;
import org.hibernate.Session;

import edu.server.repositorio.ElementoProducto;
import edu.server.repositorio.ElementoProductoId;
import edu.server.util.HibernateUtil;

public class D_ElementoProducto {
	
	public D_ElementoProducto()
	{
		
	}

	/**
	 * Método que busca en la base de datos todos los elementos que pertenezcan al código
	 * de clase pasado como parámetro
	 * @param codigoClase. Código de clase de producto.
	 * @return una lista de objetos ElementoProducto que tienen como clase la pasada como parámetro
	 */
	@SuppressWarnings("unchecked")
	public List<ElementoProducto> buscarElementosProductos(int codigoClase)
	{
		List<ElementoProducto> elementosProducto;
		
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		
		session.beginTransaction();
		
		String hql = "From ElementoProducto WHERE claseProducto = "+ codigoClase;
		
		Query query = session.createQuery(hql);
		
		elementosProducto = query.list();
		
		session.close();
		
		return elementosProducto;
	}
	
	
	/**
	 * Método que busca en la base de datos un elemento de producto.
	 * @param codigoElemento. Es el código de elemento del elemento que se pretende buscar.
	 * @return codigoElemento, codigoClase. Retorna el elemento de produco con el código de elemento y clase que se pasó como parámetro.
	 */
	public ElementoProducto buscarElementoProducto(int codigoElemento, int codigoClase)
	{
		ElementoProducto elemento = new ElementoProducto();		
		
		ElementoProductoId id = new ElementoProductoId();
		id.setCodigoElementoProducto(codigoElemento);
		id.setCodigoClaseProducto(codigoClase);
		
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		
		session.beginTransaction();
		
		elemento = (ElementoProducto) session.get(elemento.getClass(), id);
				
		//si existía el elemento en la base de datos inicializamos su clase de producto asociada
		if(elemento != null)
			Hibernate.initialize(elemento.getClaseProducto());
		
		session.close();
	
		return elemento;
	}
	
	
	/**
	 * Método que busca en la base de datos un elemento de producto.
	 * @param nombreElemento. Es el nombre del elemento que se pretende buscar.
	 * @return ElementoProducto. Retorna el elemento de producto que tiene el nombre que se pasó como parámetro.
	 */
	public ElementoProducto buscarElementoProducto(String nombreElemento)
	{
		ElementoProducto elemento = new ElementoProducto();		

		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		
		session.beginTransaction();
		
		elemento = (ElementoProducto) session.createQuery("FROM ElementoProducto WHERE nombre LIKE '" + nombreElemento + "'").uniqueResult();
				
		//si existía el elemento en la base de datos inicializamos su clase de producto asociada
		if(elemento != null)
			Hibernate.initialize(elemento.getClaseProducto());
		
		session.close();
	
		return elemento;
	}	
	
	
	/**
	 * Método que guarda en la base de datos un elemento de producto.
	 * @param elemento. Elemento de producto que se pretende guardar.
	 */
	public void registrarElementoProducto(ElementoProducto elemento) throws Exception
	{
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		
		try{
			session.beginTransaction();
			
			session.save(elemento);
					
			session.getTransaction().commit();
		}
		
		catch(Exception e)
		{
			session.getTransaction().rollback();
			throw e;
		}
	}
}
